package com.linkgie.galaxyframework.metadata;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据聚合标注；
 * 
 * 数据聚合类型({@link DataAggregate})属于 {@link ContentType} 的一种，标注的字段将生成“聚合”类型的内容类型 ({@link ContentType.Aggregate#TYPE})。
 * <p>
 * {@link DataAggregate} 用于对实体类型(标注{@link DataEntity}的类型)中的字段进行标注，并且该字段的类型必须是单值类型（或者单值类型数组），不能是对象类型（对应 {@link StandardType#OBJECT}）。<p>
 * 
 * 逻辑上而言，采用 {@link DataAggregate} 标注的字段应该是所在的实体类型的主键字段或者唯一性索引字段，与聚合的数据模型的外键（{@link #foreignKey()}）构成聚合关系；<br>
 * 但是框架并不会严格检查这一要求，目的是提供更多灵活性。应注意的是，如果当前标注的字段不是主键字段或者唯一索引字段，在应用上没有意义，并且可能会导致聚合关系中出现数据唯一性错误。
 * 
 * @author huanghaiquan
 *
 */
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(DataAggregates.class)
public @interface DataAggregate {
	

	/**
	 * 聚合的数据实体的类型(用 {@link DataEntity} 标注的接口)；
	 * 
	 * @return
	 */
	Class<?> model() default void.class;

	/**
	 * 聚合的数据接口(用 {@link DataInterface} 标注的接口)；<p>
	 * 
	 * 该接口被模型({@link #model()})实现，表达的含义是引用数据模型中的由接口声明的一部分字段的子集；<p>
	 * 
	 * 注： interfase 等同于 interface ，为了规避Java语言关键字而将字母 c 替换为 s ；
	 * 
	 * @return
	 */
	Class<?> interfase() default void.class;
	
	
	/**
	 * 聚合数据的查询条件接口；<p>
	 * 
	 * 基于查询条件接口定义了查询的条件参数，组合条件参数可控制聚合的数据范围；<p>
	 * 
	 * @return
	 */
	Class<?> conditionInterface() default void.class;
	
	/**
	 * 外键字段；<p>
	 * 
	 * 表示聚合的数据模型中与当前标注的字段一起构成聚合关系的字段；<p>
	 * 
	 * @return
	 */
	String foreignKey() default "";
	
	/**
	 * 标签字段；<p>
	 * 
	 * 表示聚合的数据模型中作为字面文字显示的字段；<p>
	 * 
	 * @return
	 */
	String labelKey() default "";
	
//
//	/**
//	 * 聚合的数据模型的下一级级联字段；<p>
//	 * 
//	 * 表示在聚合的数据模型中，用于此聚合关系进一步级联延伸到下一级的字段；<br>
//	 * 
//	 * 典型的例子便是“树状”的数据结构；<p>
//	 * 
//	 * 在聚合的数据模型中，一个字段需要满足以下条件之一，才能作为级联字段：<br>
//	 * 1. 字段的数据类型是对象类型（{@link StandardType#OBJECT}），具体类型为自身的数据模型；<br>
//	 * 2. 字段的数据类型是单值类型，但标注了引用({@link DataReference})或组合({@link DataComposite})或聚（ {@link DataAggregate} 的数据模型为自身的数据模型；
//	 * 
//	 * <p>
//	 * 
//	 * 为数据聚合指定级联字段，可以提供层级化展开待选择对象的能力；<p>
//	 * 
//	 * 注意：声明了级联关系的字段的数据类型必须是整数、字符串类型，因为作为单值类型才能够接受级联选择的引用值；
//	 * 
//	 * @return
//	 */
//	String cascadeKey() default "";
	
	
}
